<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // //请实现以下效果
        // function add (a, b, c) {
        //     return a + b + c
        // }
        // console.log(add.length);

        // const res = add(1, 2, 3) // 6

        // let addCurry = curry(add)

        // console.log(addCurry);
        // const res2 = addCurry(1)(2)(3) // 6

        // console.log(res2);
        // // 每次调用的传进来的参数做累计处理
// function reduce(...args) {
//   return args.reduce((a, b) => a + b)
// }
// function currying(fn) {
//   // 存放每次调用的参数
//   let args = []
//   return function temp(...newArgs) {
//     if (newArgs.length) {
//       // 有参数就合并进去，然后返回自身
//       args = [...args, ...newArgs]
//       return temp
//     } else {
//       // 没有参数了，也就是最后一个了，执行累计结果操作并返回结果
//       let val = fn.apply(this, args)
//       args = [] //保证再次调用时清空
//       return val
//     }
//   }
// }
// let add = currying(reduce)
// console.log(add(1)(2, 3, 4)(5)()) //15
// console.log(add(1)(2, 3)(4, 5)()) //15

function curry(fn) {
  if (fn.length <= 1) {
    return fn
  }
  var returnFn = (...args) => {
    //console.log(...args,typeof ...args);
    if (fn.length === args.length) {
      //参数都传齐时
      return fn(...args)
    } else {
      //参数没传齐时,就返回一个函数
      return (...args2) => {
        console.log(args2, '     ', args)
        return returnFn(...args, ...args2)
      }
    }
  }
  return returnFn
}
var add = (a, b, c, d) => a + b + c + d
//包装add
var returnFn = curry(add)
// 递归传递参数给returnFn
var returnFnArrowFn = returnFn(1)(2)(3)
// 参数传齐，returnFn将参数传递给输入函数fn, 并调用fn
returnFnArrowFn(4) // 10
    </script>
</body>

</html>